DSS Mouse Experiment 2 with Upa and Vada

Set up libraries to run code.

Code
library(tidyverse)
library(readxl)
library(janitor)
library(ggbeeswarm)
library(scales)

DSS Mouse Experiment 2

This experiment was to test Upa/Vada vs Upa alone vs. DSS colitis.

This experiment used DSS in water at 3% for 8 days, rather than the planned 7, because the mice were slow to develop rectal bleeding. This led to only only one day of rest on regular drinking water.

Each arm of the study included C57BL6 male mice, 5 or 10 per group.

Drug treatment with Upa and/or Vada started the day before DSS started (Day 1), on Experiment day 0.

The groups were:

  1. Negative controls (no DSS, vehicle gavage) - 5 mice - one lost
  2. Drug controls (no DSS, Upa 30 mpk, Vada 3 mpk) - 5 mice
  3. DSS positive controls (DSS, vehicle) - 10 mice
  4. DSS + Upa 30 mpk - group 5 - 10 mice (anti-inf rx) (one outlier very sick)
  5. DSS + Upa 30 mpk + vada 3 mpk - 10 mice (anti-inf + BET)

Read in Data

Final data are from day 10 (sac day).

Daily data by mouse are from day 0 to day 10

Code
dat <- readxl::read_xlsx("tidy data for vada-upa experiment2.xlsx") |> 
  clean_names() |> 
  mutate(rx = factor(rx, ordered = TRUE,
          levels = c("water+ vehicle", "water+ Vada/Upa",
                     "DSS+  vehicle", "DSS+  Upa",
                     "DSS+  Vada/Upa"))) |> 
  rename(ear_tag = mouse)

dat_daily <- readxl::read_xlsx("BW blood data daily.xlsx") |> 
  janitor::clean_names() |> 
  mutate(mouse = as.factor(mice)) |> 
  mutate(ear_tag = as.factor(ear_tag)) |> 
  select(-mice) |> 
  relocate(mouse)

dat |> select(ear_tag, rx) |> 
  mutate(ear_tag = as.factor(ear_tag)) ->
dat2

dat_daily|> 
  left_join(dat2, by = join_by(ear_tag)) ->
daily2

fitc1 <- read_xlsx("FITC results with methods.xlsx", skip = 2) |> 
  janitor::clean_names() |> 
  select(1:2) |> 
  slice(1:23) |> 
  rename(ear_tag = mouse)

fitc2 <- left_join(fitc1, dat2)

Graph BW by day

Code
daily2 |> 
  ggplot(aes(y = body_weight_g, x = day, 
             group = mouse, color = rx)) + scale_color_manual(values = c("gray50", "black", "red", "purple", "blue")) +
  scale_x_continuous(breaks = seq(0,10, by=2)) +
  #geom_line() +
  #geom_point() +
  geom_smooth(aes(group = rx), se = FALSE)

Findings:

  • Minor weight loss with drug control
  • Significant weight loss with DSS, especially after day 6
  • Upa weight loss was as bad and often worse than DSS alone
  • Vada/Upa had more weight loss than DSS alone initially, but matched DSS after day 8 (better than Upa alone)

Graph blood by day

Note no stool blood in the controls, and minimal delay in the onset and severity of stool blood with Upa, but noticeably delayed blood when Vada was added to Upa.

Code
daily2 |> 
  ggplot(aes(y = stool_blood, x = day, 
             group = mouse, color = rx)) +
  #geom_line() +
  #geom_point() +
  geom_smooth(aes(group = rx), se = FALSE) +
  scale_color_manual(values = c("gray50", "black", "red", "purple", "blue")) +
  scale_x_continuous(breaks = seq(0,10, by=2)) +
  labs(color = "Treatment",
       x = "Day",
       y = "Stool blood (0-4)",
       title = "Effect of Treatment on Smoothed Daily Mean Stool Blood Scores",
       subtitle = "Vadadustat Delays Rectal Bleeding by ~ 1 Day")

Findings:

  • No bleeding in negative control or drug control
  • Onse of bleeding starting at day 5 in DSS, reached peak by dat 7-8
  • Very similar progression of bleeding in Upa group
  • Delayed onset of bleeding in Vada/Upa group, consistently delayed in onset/severity by ~ 1 day

Let’s compare the colon weights by group

Code
dat |> 
  ggplot(aes(y= colon_weight, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Colon Weight in grams",
        caption = "Pairwise Comparisons with Student's t test", 
        title = "Colon Weight by Treatment Group")+ 
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

It looks like we need to control for body weight. Let’s normalize colon weight to body weight to see if this is cleaner.

Code
# try control for bw
daily2 |> 
  filter(day == 10) ->
day10wt

dat |>
  mutate(ear_tag = as.factor(ear_tag)) |> 
  left_join(day10wt) |> 
  select(ear_tag, rx, colon_weight, body_weight_g) |> 
  mutate(adj_colon_wt = colon_weight/body_weight_g) |> 
  ggplot(aes(y= adj_colon_wt, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Colon Weight / body weight",
        caption = "Pairwise Comparisons with Student's t test", 
        title = "BW-adjusted Colon Weight by Treatment Group")+ 
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Findings:

  • Minor loss of weight with drug control
  • Big increase in colon weight with DSS
  • Partial restoration with Upa
  • More restoration with Vada/Upa, NS difference from normal colon
  • Appears more reasonable after we normalize to body weight

Now compare the colon lengths by group

Code
dat |> 
  ggplot(aes(y= colon_length, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Colon Length in cm",
        caption = "Pairwise Comparisons with Student's t test",
        title = "Colon Length by Treatment Group")+
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

It looks like we need to control for body weight. Let’s try to normalize colon length to body weight.

Code
# try control for bw
daily2 |> 
  filter(day == 10) ->
day10wt

dat |>
  mutate(ear_tag = as.factor(ear_tag)) |> 
  left_join(day10wt) |> 
  select(ear_tag, rx, colon_length, body_weight_g) |> 
  mutate(adj_colon_len = colon_length/body_weight_g) |> 
  ggplot(aes(y= adj_colon_len, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Colon Length / body weight",
        caption = "Pairwise Comparisons with Student's t test", 
        title = "BW-adjusted Colon Length by Treatment Group")+ 
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Findings:

  • some loss of length with drug control

  • big loss of length with DSS

  • partial restoration with Upa

  • More length restoration with Vada/Upa, now NS difference from normal colon length

  • Looks more reasonable after we normalize to body weight

Now compare the colon ‘density’ (ratio of grams weight/cm length) by group

Code
dat |> 
  ggplot(aes(y= colon_density, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Colon Ratio in grams/cm",
        caption = "Pairwise Comparisons with Student's t test",
        title = "Colon Ratio of Weight to Length by Treatment Group",
        subtitle = "Colon Ratio in grams/cm")+
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Findings:

  • no change in weight to length ratio with drug control
  • big increase in weight to length ratio with DSS
  • partial restoration with Upa
  • more restoration with Vada/Upa, NS difference from normal colon
  • by comparing the ratio, we address differences in body weight and do not have to adjust for this in mice.

This makes sense.

Graph FITC by Treatment Group

Mice were kept NPO overnight, then given 4 kDa FITC-Dextran (Sigma : 60842-46-8) by oral gavage at a dose of 0.6 mg/g of mouse body weight in a volume of 100 microL in the morning.

Blood was sampled 4 hours later, and serum was separated.

From a 150 mg/mL stock solution of 4 kDa FITC-Dextran, we used 4.27 microL, and added FITC negative mouse serum to bring this up to 1 mL, to produce a max solution of 640 micrograms/mL, then made serial 2 fold dilutions for the standard curve.

The blank control was made with 25 microL of FITC negative serum and added 75 microL of saline,

Fluorescence was induced with a 488 nm excitation laser through a 480 nm +/1 20 nm filter, and emissions were read 508 nm +/- 20 nm to capture the 525 nm peak, and the detector gain was set at 35.

Code
fitc2 |> 
  filter(fitc_ug_ml <100) |> 
  ggplot(aes(y= fitc_ug_ml, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Serum FITC in micrograms/mL",
        caption = "Pairwise Comparisons with Student's t test\nExcluded one (very sick) DSS/Upa outlier with Serum FITC > 150 ug/mL", 
        title = "Colon Leak by Treatment Group",
        subtitle = "Measured by Serum FITC Dextran in ~ 50% of mice")+ 
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(2,5), c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Findings:

  • had to exclude one very sick outlier with very severe leak (FITC measured > 150 ug/mL) in the Upa group
  • no change in FITC with drug control
  • big increase in FITC with DSS - lots of leak as expected
  • no significant change in FITC with Upa
  • significant decrease in FITC with Vada/Upa - almost back to normal (NS differenc from normal)
  • not affected by adjustment for BW
  • with more money and time, we should increase sample size and measure FITC in all mice

Makes sense - Upa does not have a significant effect on FITC, while Vada normalizes FITC.

Two distinct mechanisms

Now compare the spleen weight to body mass ratio by group

Code
dat |> 
  ggplot(aes(y= spleen_wt_bw, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Spleen to Body Weight Ratio",
        caption = "Pairwise Comparisons with Student's t test",
        title = "Spleen to Body Weight Ratio by Treatment Group") +
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Findings:

  • no difference with drug control
  • big inflamed spleen in DSS, collecting a lot of damaged epithelial cells and immune cells
  • partial recovery with Upa
  • more recovery with vada/upa
  • still not entirely normal.

Now compare the day 10 Disease Activity Index

Code
dat |> 
  ggplot(aes(y= day10_dia, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Day 10 Disease Activity Index",
  caption = "Pairwise Comparisons with Student's t test",
        title = "Day 10 DAI by Treatment Group") +
  ggsignif::geom_signif(comparisons = list(
    c(1,2), c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")
Warning: Computation failed in `stat_signif()`.
Caused by error in `if (p_value < .Machine$double.eps) ...`:
! missing value where TRUE/FALSE needed

Findings:

  • no difference with drug control
  • Ordinal, not truly continuous outcome, so problems with p values (lots of ties)
  • big disease activity with DSS
  • partial improvement with Upa
  • partial improvement with Vada/Upa
  • May need more recovery time
  • Possibly 4 days recovery on water without DSS plus drugs?

Now compare the day 7 stool bleeding score

Code
dat |> 
  ggplot(aes(y= day7_stool_bleeding, x = rx)) +
  geom_boxplot() + 
  geom_beeswarm() +
  labs( x = "Treatment Group",
        y = "Day 7 Stool Bleeding Score",
        caption = "Pairwise Comparisons usiing Student's t Test\nToo many ties to calculate several p values",
        title = "Day 7 Stool Bleeding Score by Treatment Group")+
  ggsignif::geom_signif(comparisons = list(
     c(1,3), c(2,3), c(3,4), c(3,5)),
    test = "t.test",
    step_increase = 0.12) +
  scale_x_discrete(labels = label_wrap(6)) +
  theme_linedraw(base_size = 16, base_family = "Arial")
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_boxplot()`).
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_signif()`).
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_point()`).

Findings:

  • no bleeding with drug control

  • Lots of bleeding peaking at day 8 in DSS

  • Slightly less bleeding with Upa

  • Slightly less bleeding with Vada/Upa

  • Ordinal, not truly continuous outcome, so problems with some p values (lots of ties)

  • Possibly need more recovery/healing time - 4 days on water without DSS plus treatment during this time?

Now compare the Histology Scores from Masked Pathologist Yao Lee

Pathologist Yao Lee scored H&E stained colon sections from each mouse in a masked fashion.

Scores were given for inflammation (0-4), edema (0-4), epithelial damage (0-4), mucosal hyperplasia (0-4), and fibrosis (0-4).

A total histology score was calculated as the sum of these individual scores (0-20). Comparing by Arm, scores for inflammation, edema, epithelial damage, mucosal hyperplasia, fibrosis, and total histology score.

Code
load("upa_vada_exp2_histo.Rdata")

histo2 <- histo |> 
  janitor::clean_names() |>
  mutate(ied_score = inflammation + edema + epithelial_damage) |> 
  mutate(rx = case_when(
    rx == "vehicle" ~ "Water + Vehicle",
    rx == "vehicle+ vada/upa" ~ "Water + Upa/Vada",
    rx == "DSS" ~ "DSS + Vehicle",
    rx == "DSS+upa" ~ "DSS + Upa",
    rx == "DSS+ vada/upa" ~ "DSS + Upa/Vada"
  )) |> 
  mutate(rx = factor(rx, ordered = TRUE,
          levels = c("Water + Vehicle", "Water + Upa/Vada",
                     "DSS + Vehicle", "DSS + Upa",
                     "DSS + Upa/Vada")))

histo2 |>
  group_by(rx) |>
  ggplot(aes(y= inflammation, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
  labs(x = "Treatment Group",
        y = "Inflammation Histology Score",
        title = "Inflammation Histology Scores by Treatment Group",
       caption = "Mean Values Shown in Red") +
  scale_y_continuous(limits = c(0,4.7), breaks = seq(0, 4, by = 1)) +
  ggsignif::geom_signif(comparisons = list(
    c(1,3), c(3,4), c(3,5), c(4,5), c(1,4), c(1,5)),
    test = "t.test",
    step_increase = 0.10) +
  scale_x_discrete(labels = label_wrap(8)) +
  theme_linedraw(base_size = 16, base_family = "Arial") +
  annotate("text", x = 2.49, y = 1.9, label = "1.9", size = 5, color ="red") +
  annotate("text", x = 3.49, y = 1.9, label = "1.9", size = 5, color ="red") +
  annotate("text", x = 4.49, y = 1.1, label = "1.1", size = 5, color ="red")

Code
histo2 |>
  group_by(rx) |>
  ggplot(aes(y= edema, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
   labs(x = "Treatment Group",
        y = "Edema Histology Score",
        title = "Edema Histology Scores by Treatment Group",
       caption = "Mean Values Shown in Red") +
  scale_y_continuous(limits = c(0,4), breaks = seq(0, 4, by = 1)) +
  ggsignif::geom_signif(comparisons = list(
    c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.10) +
  scale_x_discrete(labels = label_wrap(8)) +
  theme_linedraw(base_size = 16, base_family = "Arial") +
  annotate("text", x = 2.49, y = 0.8, label = "0.8", size = 5, color ="red") +
  annotate("text", x = 3.49, y = 0.7, label = "0.7", size = 5, color ="red") +
  annotate("text", x = 4.49, y = 0.3, label = "0.3", size = 5, color ="red")

Code
histo2 |>
  group_by(rx) |>
  ggplot(aes(y= epithelial_damage, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
   labs(x = "Treatment Group",
        y = "Epithelial Damage Histology Score",
        title = "Epithelial Damage Histology Scores by Treatment Group",
       caption = "Mean Values Shown in Red") +
  scale_y_continuous(limits = c(0, 6.2), breaks = seq(0, 4, by = 1)) +
  ggsignif::geom_signif(comparisons = list(
    c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.10) +
  scale_x_discrete(labels = label_wrap(8)) +
  theme_linedraw(base_size = 16, base_family = "Arial") +
  annotate("text", x = 2.49, y = 2.7, label = "2.7", size = 5, color ="red") +
  annotate("text", x = 3.49, y = 1.9, label = "1.9", size = 5, color ="red") +
  annotate("text", x = 4.49, y = 1.2, label = "1.2", size = 5, color ="red")

Code
histo2 |>
  group_by(rx) |>
  ggplot(aes(y= epithelial_damage_extent, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
   labs(x = "Treatment Group",
        y = "Epithelial Damage Extent Histology Score",
        title = "Epithelial Damage Extent Histology Scores by Treatment Group" ) +
   ggsignif::geom_signif(comparisons = list(
    c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.10) +
  scale_x_discrete(labels = label_wrap(8)) +
  scale_y_continuous(limits = c(0,4.7), breaks = seq(0, 4, by = 1)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Code
histo2 |>
  group_by(rx) |>
  ggplot(aes(y= mucosal_hyperplasia, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
   labs(x = "Treatment Group",
        y = "Mucosal Hyperplasia Histology Score",
        title = "Mucosal Hyperplasia Histology Scores by Treatment Group" ) +
  scale_x_discrete(labels = label_wrap(8)) +
  scale_y_continuous(limits = c(0,4.1), breaks = seq(0, 4, by = 1)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Code
histo2 |>
  group_by(rx) |>
  ggplot(aes(y= fibrosis, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
   labs(x = "Treatment Group",
        y = "Fibrosis Histology Score",
        title = "Fibrosis Histology Scores by Treatment Group" ) +
  scale_x_discrete(labels = label_wrap(8)) +
  scale_y_continuous(limits = c(0,4.1), breaks = seq(0, 4, by = 1)) +
  theme_linedraw(base_size = 16, base_family = "Arial")

Code
histo2 |>
  group_by(rx) |>
  ggplot(aes(y= tot_histo_score, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
   labs(x = "Treatment Group",
        y = "Total Histology Score",
        title = "Total Histology Scores by Treatment Group",
       caption = "Mean Values Shown in Red") +
   ggsignif::geom_signif(comparisons = list(
    c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.10) +
  scale_x_discrete(labels = label_wrap(8)) +
  scale_y_continuous(breaks = seq(0, 15, by = 3)) +
  theme_linedraw(base_size = 16, base_family = "Arial")  +
  annotate("text", x = 2.49, y = 7.1, label = "7.1", size = 5, color = "red") +
  annotate("text", x = 3.49, y = 5.9, label = "5.9", size = 5, color = "red") +
  annotate("text", x = 4.49, y = 3.6, label = "3.6", size = 5, color = "red")

Code
histo2 |>
  group_by(rx) |>
  ggplot(aes(y= ied_score, x = rx)) +
  geom_boxplot() +
  geom_quasirandom() +
   labs(x = "Treatment Group",
        y = "IED (Inflammation, Edema, and Epithelial Damage)\nHistology Score",
        title = "IED (Inflammation, Edema, and Epithelial Damage)\nHistology Scores by Treatment Group",
        caption = "Mean Values Shown in Red") +
   ggsignif::geom_signif(comparisons = list(
    c(1,3), c(3,4), c(3,5), c(4,5), c(1,4),
    c(1,5)),
    test = "t.test",
    step_increase = 0.10) +
  scale_x_discrete(labels = label_wrap(8)) +
  scale_y_continuous(breaks = seq(0, 12, by = 3)) +
  theme_linedraw(base_size = 16, base_family = "Arial") +
  annotate("text", x = 2.48, y = 5.4, label = "5.4", size = 5, color = "red") +
  annotate("text", x = 3.48, y = 4.5, label = "4.5", size = 5, color = "red") +
  annotate("text", x = 4.48, y = 2.6, label = "2.6", size = 5, color = "red") 

Conclusions

In this DSS colitis model, we saw weight loss, bleeding, and short, thick colons, with substantial histologic inflammation, edema, and epithelial damage as expected in the DSS arm. The drug control arm had minimal weight loss, no bleeding, and no other changes.

Upa alone did not improve weight loss, with minimal effects on bleeding and FITC leak, and modest effects on histologic inflammation, edema, and epithelial damage. There was partial improvement in BW-adjusted colon weight, BW-adjusted length, colon weight/length ratio, and spleen size.

The combination of Vada with Upa improved weight loss modestly, delayed bleeding by about 1 day, and significantly improved FITC leak back to near normal. There was more improvement in BW-adjusted colon weight, BW-adjusted length, colon weight/length ratio, all of which returned to near-normal (NS). The spleen size also improved more than with Upa alone, but did not return to normal. Histologically, Vada/Upa improved inflammation, edema, and epithelial damage scores significantly, and by more than Upa alone (not quite significant with N=10 per group), but not back to normal.

Next Steps:

We are continuing to examine:

  • RT-PCR for transcription of key genes in inflammation and barrier function
  • Western blots of key proteins in barrier function and inflammation
  • Immunohistochemistry of key proteins in barrier function and inflammation